import 'package:flutter/material.dart';

class FlyInOutWidget extends StatefulWidget {
  final Widget child;

  const FlyInOutWidget({super.key, required this.child});

  @override
  State<FlyInOutWidget> createState() => _FlyInOutWidgetState();
}

class _FlyInOutWidgetState extends State<FlyInOutWidget>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  late Animation<Offset> _slideAnimation;

  @override
  void initState() {
    super.initState();

    // 1. 创建动画控制器，总时长2.5秒
    _controller = AnimationController(
      duration: const Duration(milliseconds: 2500), // 2500ms = 250+2000+250
      vsync: this,
    );

    // 2. 创建飞入、停留、飞出的动画序列
    _slideAnimation = TweenSequence<Offset>(
      [
        // 阶段1: 飞入 (0ms - 250ms)
        TweenSequenceItem(
          tween: Tween<Offset>(
            begin: const Offset(1.0, 0.0), // 从屏幕右侧外开始
            end: Offset.zero,               // 移动到屏幕中央
          ).chain(CurveTween(curve: Curves.easeInOut)),
          weight: 0.1, // 占总时长的10% (250ms)
        ),
        // 阶段2: 停留 (250ms - 2250ms) - 此阶段偏移量保持不变
        TweenSequenceItem(
          tween: ConstantTween<Offset>(Offset.zero), // 保持在屏幕中央
          weight: 0.8, // 占总时长的80% (2000ms)
        ),
        // 阶段3: 飞出 (2250ms - 2500ms)
        TweenSequenceItem(
          tween: Tween<Offset>(
            begin: Offset.zero,              // 从屏幕中央开始
            end: const Offset(-1.0, 0.0),   // 移动到屏幕左侧外
          ).chain(CurveTween(curve: Curves.easeInOut)),
          weight: 0.1, // 占总时长的10% (250ms)
        ),
      ],
    ).animate(_controller);

     // 关键修改：添加状态监听器
    _controller.addStatusListener((status) {
      if (status == AnimationStatus.completed) {
        // 动画完成后，重置并立即重新开始，实现循环
        _controller.reset();
        _controller.forward();
      }
    });

    // 3. 启动动画 (可选：在组件构建完成后开始)
    WidgetsBinding.instance.addPostFrameCallback((_) {
      _controller.forward();
    });
  }

  @override
  void dispose() {
    _controller.dispose(); // 释放控制器资源
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return SlideTransition(
      position: _slideAnimation,
      child: widget.child, // 你的与屏幕等宽的视图
    );
  }
}

// 使用示例
class MyAnimatedPage extends StatelessWidget {
  const MyAnimatedPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('飞入飞出动画')),
      body: FlyInOutWidget(
        // 确保你的内容视图与屏幕等宽，例如使用 SizedBox 或 Container 约束
        child: SizedBox(
          width: MediaQuery.of(context).size.width,
          child: const Card(
            color: Colors.blue,
            child: Padding(
              padding: EdgeInsets.all(20.0),
              child: Text(
                '你好！我是飞入的视图！',
                style: TextStyle(color: Colors.white, fontSize: 24),
                textAlign: TextAlign.center,
              ),
            ),
          ),
        ),
      ),
    );
  }
}